// arrayValue.js
// 数组中的特殊值 比如: NaN 


var arr = [1,1,'true','true',true,true,15,15,false,false, 
undefined,'a',-0, undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];

console.log(arr.includes(NaN))	// 可以区分 NaN
var firstPos = arr.indexOf(NaN)
console.log(firstPos)	// -1 
console.log(arr.indexOf(NaN, firstPos+1))	// -1 
console.log(arrayIndex(arr, NaN))
console.log(arrayIndexV2(arr, NaN))
console.log(arrayIndexV3(arr, NaN))

console.log('-----------------------\n')


/**
 * 解决Array.prototype.indexOf 不能查找NaN数据的问题
 * @param  {[type]} arr [description]
 * @return {[type]}     [description]
 */
function arrayIndex(arr, item, start = 0) {
	if(!Array.isArray(arr)) { 
		throw new TypeError('Excepted an array got ' + typeof arr)
	}
	var findIndex = -1;
	for (var i = start; i < arr.length; i++) {
		if(Number.isNaN(item)) {
			if(Number.isNaN(arr[i])) {
				findIndex = i
				break
			}
		} else {
			if(arr[i] === item) {
				findIndex = i
				break
			}
		}
	}

	return findIndex ;
}

/**
 * [arrayIndexV2 description]
 * @param  {[type]} arr   [description]
 * @param  {[type]} item  [description]
 * @param  {Number} start [description]
 * @return {[type]}       [description]
 */
function arrayIndexV2(arr, item, start = 0) {
	if(!Array.isArray(arr)) { 
		throw new TypeError('Excepted an array got ' + typeof arr)
	}
	var findIndex = -1;
	// 两种情况 在循环外面进行判断
	
	// 特殊情况 特殊处理 NaN
	if(Number.isNaN(item)) {
		for (var i = start; i < arr.length; i++) {
			if(Number.isNaN(arr[i])) {
				findIndex = i
				break
			}
		}
		return  findIndex
	}
	
	// 其他情况借助 Array.protype.indexOf 方法实现	
	return arr.indexOf(item, start) ;
}


/**
 * [arrayIndexV3 description]
 * @param  {[type]} arr   [description]
 * @param  {[type]} item  [description]
 * @param  {Number} start [description]
 * @return {[type]}       [description]
 */
function arrayIndexV3(arr, item, start = 0) {
	if(!Array.isArray(arr)) { 
		throw new TypeError('Excepted an array got ' + typeof arr)
	}
	var findIndex = -1;
	// 两种情况 在循环外面进行判断 提取两个判断的比较器函数
	
	var comparator = null 
	// 特殊情况 特殊处理 NaN 
	if(Number.isNaN(item)) {
		comparator = function(a) {
			return Number.isNaN(a)
		}
	} else {
		comparator = function(a) {
			return a === item
		}
	}

	// 将不同的部分提起抽取处理， 然后再循环遍历
	for (var i = start; i < arr.length; i++) {
		if(comparator(arr[i])) {
			findIndex = i
			break
		}
	}

	return findIndex
}





console.log(arr.includes(undefined))	// 可以区分 undefined
var firstPos = arr.indexOf(undefined)
console.log(firstPos)	// 10
console.log(arr.indexOf(undefined, firstPos+1))	// 


console.log(arr.indexOf(undefined, 33231))	// 







